package com.simple.create.singleton.sample5;


/**
 * 单例模式5
 * 将创建实例与获取实例分开
 *
 * @author simple
 * @version 1.0
 * @date 2018/12/6 14:39
 * @since 1.0
 */
public class Singleton {

    /**
     * 私有的构造方法, 防止被外部实例化(反射?)
     */
    private Singleton() {
    }

    /**
     * 持有私有的静态实例, 防止被引用, 赋值为null, 实现延迟加载
     */
    private static Singleton instance = null;

    private static synchronized void syncInit() {
        if (null == instance) {
            instance = new Singleton();
        }
    }

    /**
     * 提供静态方法, 用于获取实例
     *
     * @return 实例
     */
    public static Singleton getInstance() {
        if (null == instance) {
            syncInit();
        }
        return instance;
    }

    /**
     * 如果该对象被序列化, 可以保证对象在序列化前后保持一致
     *
     * @return 实例
     */
    public Object readResolve() {
        return getInstance();
    }
}
